import type { AxiosError, AxiosResponse } from 'axios'

import NProgress from '../progress'
import { Message } from '../../utils/Message'

import { version } from '../../../package.json'

import { getQueryParams } from '../index'

import { type KAxiosInterceptor, type CreateAxiosOptions, isMobile, isXcx } from '@kukefe/kkutils'

// 加载环境变量 VITE_PROXY_DOMAIN（开发环境）  VITE_PROXY_DOMAIN_REAL（打包后的线上环境）

import type { HttpHeaders } from './types'

const { appId } = getQueryParams(window.location.href) as Record<string, string>
import { os } from '../../utils/index'

//租户的lesseeId和产品线的appId
let headers: HttpHeaders = {
  contentType: 'application/json',
  accept: 'application/json',
  'kk-version': version,
  'tenant-id': '',
  'kk-platform': appId as string, // 产品线的appId
  'kk-terminal-type': 'pc',
  'kk-from': 'web'
}

/**
 *
 * @param "kk-terminal-type" { string }  - 客户端的类型
 * @param "kk-from" { string }  - 请求来源（请求客户端类型）
 * @param "kk-platform" { string }  - 平台
 * @param "kk-os" { string? }  - 客户端系统版本 ios12.2/pc和手机站传浏览器的版本号
 * @param "kk-modle" { string? }  - 客户端型号 iphone11/huawei mate10 /（PC端传浏览器的版本号）/h5能获取到机型就传机型获取不到就传手机所属系统
 *
 */
if (os?.isAndroid) {
  headers['kk-terminal-type'] = 'android'
} else if (os?.isPhone) {
  headers['kk-terminal-type'] = 'iphone'
} else if (os?.isTablet) {
  headers['kk-terminal-type'] = 'ipad'
} else if (os?.isPc) {
  headers['kk-terminal-type'] = 'pc'
}

if (isMobile()) {
  if (isXcx()) {
    headers['kk-from'] = 'wechat-app'
  } else {
    headers['kk-from'] = 'h5'
  }
} else if (os?.isPc) {
  headers['kk-from'] = 'web'
} else {
  console.error('kk-from 配置错误')
}

export const interceptor: KAxiosInterceptor = {
  /**
   * @description: 请求拦截器处理
   */
  requestInterceptors: async (config: CreateAxiosOptions) => {
    if (!appId) {
      Message('没有产品线id,请检查路由参数')
      throw new Error('没有产品线id,请检查路由参数appId=xxx')
    }

    if (!config.customConfig?.hideLoading) {
      // 开启进度条动画
      NProgress.start()
    }

    Object.assign(config.headers, headers)
    return config
  },

  /**
   * @description: 响应拦截器处理
   */
  responseInterceptors: (response: AxiosResponse<any>) => {
    // 获取结果数据
    const $data = response.data

    // 关闭进度条动画
    NProgress.done()
    localStorage.setItem('serviceTime', response.headers.date)

    if ($data.code === '10000') {
      return response
    } else {
      Message($data.msg)
      // if (['11105', '10041', '10103'].includes($data.code)) {
      //   ElMessageBox.confirm($data.msg || '登录已失效，请重新登录', '确定退出', {
      //     showClose: false,
      //     showCancelButton: false,
      //     closeOnClickModal: false,
      //     confirmButtonText: '确定',
      //     type: 'warning'
      //   })
      //     .then(() => {
      //       location.reload()
      //     })
      //     .catch(() => {
      //       location.reload()
      //     })
      // } else {
      //   ElMessage({
      //     message: $data.msg,
      //     type: 'error'
      //   })
      // }
      return Promise.reject(response)
    }
  },

  /**
   * @description: 响应错误处理
   */
  responseInterceptorsCatch: (error: AxiosError) => {
    if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
      Message('请求接口超时，请刷新重试～')
    }

    // 所有的响应异常 区分来源为取消请求/非取消请求
    return Promise.reject(error)
  }
}
